function Music() {
    this.init();
}
(function () {
    var pages = [],
        panels = [],
        selectedItem = null;
    Music.prototype = {
        total: 70,
        pageSize: 10,
        dataUrl:
            "http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.common",
        playerUrl: "http://box.baidu.com/widget/flash/bdspacesong.swf",

        init: function () {
            var me = this;
            domUtils.on($G("J_searchName"), "keyup", function (event) {
                var e = window.event || event;
                if (e.keyCode == 13) {
                    me.dosearch();
                }
            });
            domUtils.on($G("J_searchBtn"), "click", function () {
                me.dosearch();
            });
        },
        callback: function (data) {
            var me = this;
            me.data = data.song_list;
            setTimeout(function () {
                $G("J_resultBar").innerHTML = me._renderTemplate(
                    data.song_list
                );
            }, 300);
        },
        dosearch: function () {
            var me = this;
            selectedItem = null;
            var key = $G("J_searchName").value;
            if (utils.trim(key) == "") return false;
            key = encodeURIComponent(key);
            me._sent(key);
        },
        doselect: function (i) {
            var me = this;
            if (typeof i == "object") {
                selectedItem = i;
            } else if (typeof i == "number") {
                selectedItem = me.data[i];
            }
        },
        onpageclick: function (id) {
            var me = this;
            for (var i = 0; i < pages.length; i++) {
                $G(pages[i]).className = "pageoff";
                $G(panels[i]).className = "paneloff";
            }
            $G("page" + id).className = "pageon";
            $G("panel" + id).className = "panelon";
        },
        listenTest: function (elem) {
            var me = this,
                view = $G("J_preview"),
                is_play_action = elem.className == "m-try",
                old_trying = me._getTryingElem();

            if (old_trying) {
                old_trying.className = "m-try";
                view.innerHTML = "";
            }
            if (is_play_action) {
                elem.className = "m-trying";
                view.innerHTML = me._buildMusicHtml(me._getUrl(true));
            }
        },
        _sent: function (param) {
            var me = this;
            $G("J_resultBar").innerHTML = '<div class="loading"></div>';

            utils.loadFile(document, {
                src:
                    me.dataUrl +
                    "&query=" +
                    param +
                    "&page_size=" +
                    me.total +
                    "&callback=music.callback&.r=" +
                    Math.random(),
                tag: "script",
                type: "text/javascript",
                defer: "defer",
            });
        },
        _removeHtml: function (str) {
            var reg = /<\s*\/?\s*[^>]*\s*>/gi;
            return str.replace(reg, "");
        },
        _getUrl: function (isTryListen) {
            var me = this;
            var param =
                "from=tiebasongwidget&url=&name=" +
                encodeURIComponent(me._removeHtml(selectedItem.title)) +
                "&artist=" +
                encodeURIComponent(me._removeHtml(selectedItem.author)) +
                "&extra=" +
                encodeURIComponent(me._removeHtml(selectedItem.album_title)) +
                "&autoPlay=" +
                isTryListen +
                "" +
                "&loop=true";
            return me.playerUrl + "?" + param;
        },
        _getTryingElem: function () {
            var s = $G("J_listPanel").getElementsByTagName("span");

            for (var i = 0; i < s.length; i++) {
                if (s[i].className == "m-trying") return s[i];
            }
            return null;
        },
        _buildMusicHtml: function (playerUrl) {
            var html =
                '<embed class="BDE_try_Music" allowfullscreen="false" pluginspage="http://www.macromedia.com/go/getflashplayer"';
            html += ' src="' + playerUrl + '"';
            html +=
                ' width="1" height="1" style="position:absolute;left:-2000px;"';
            html +=
                ' type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false"';
            html += ' menu="false" allowscriptaccess="never" scale="noborder">';
            return html;
        },
        _byteLength: function (str) {
            return str.replace(/[^\u0000-\u007f]/g, "\u0061\u0061").length;
        },
        _getMaxText: function (s) {
            var me = this;
            s = me._removeHtml(s);
            if (me._byteLength(s) > 12) return s.substring(0, 5) + "...";
            if (!s) s = "&nbsp;";
            return s;
        },
        _rebuildData: function (data) {
            var me = this,
                newData = [],
                d = me.pageSize,
                itembox;
            for (var i = 0; i < data.length; i++) {
                if ((i + d) % d == 0) {
                    itembox = [];
                    newData.push(itembox);
                }
                itembox.push(data[i]);
            }
            return newData;
        },
        _renderTemplate: function (data) {
            var me = this;
            if (data.length == 0)
                return '<div class="empty">' + lang.emptyTxt + "</div>";
            data = me._rebuildData(data);
            var s = [],
                p = [],
                t = [];
            s.push('<div id="J_listPanel" class="listPanel">');
            p.push('<div class="page">');
            for (var i = 0, tmpList; (tmpList = data[i++]); ) {
                panels.push("panel" + i);
                pages.push("page" + i);
                if (i == 1) {
                    s.push('<div id="panel' + i + '" class="panelon">');
                    if (data.length != 1) {
                        t.push(
                            '<div id="page' +
                                i +
                                '" onclick="music.onpageclick(' +
                                i +
                                ')" class="pageon">' +
                                i +
                                "</div>"
                        );
                    }
                } else {
                    s.push('<div id="panel' + i + '" class="paneloff">');
                    t.push(
                        '<div id="page' +
                            i +
                            '" onclick="music.onpageclick(' +
                            i +
                            ')" class="pageoff">' +
                            i +
                            "</div>"
                    );
                }
                s.push('<div class="m-box">');
                s.push(
                    '<div class="m-h"><span class="m-t">' +
                        lang.chapter +
                        '</span><span class="m-s">' +
                        lang.singer +
                        '</span><span class="m-z">' +
                        lang.special +
                        '</span><span class="m-try-t">' +
                        lang.listenTest +
                        "</span></div>"
                );
                for (var j = 0, tmpObj; (tmpObj = tmpList[j++]); ) {
                    s.push(
                        '<label for="radio-' + i + "-" + j + '" class="m-m">'
                    );
                    s.push(
                        '<input type="radio" id="radio-' +
                            i +
                            "-" +
                            j +
                            '" name="musicId" class="m-l" onclick="music.doselect(' +
                            (me.pageSize * (i - 1) + (j - 1)) +
                            ')"/>'
                    );
                    s.push(
                        '<span class="m-t">' +
                            me._getMaxText(tmpObj.title) +
                            "</span>"
                    );
                    s.push(
                        '<span class="m-s">' +
                            me._getMaxText(tmpObj.author) +
                            "</span>"
                    );
                    s.push(
                        '<span class="m-z">' +
                            me._getMaxText(tmpObj.album_title) +
                            "</span>"
                    );
                    s.push(
                        '<span class="m-try" onclick="music.doselect(' +
                            (me.pageSize * (i - 1) + (j - 1)) +
                            ');music.listenTest(this)"></span>'
                    );
                    s.push("</label>");
                }
                s.push("</div>");
                s.push("</div>");
            }
            t.reverse();
            p.push(t.join(""));
            s.push("</div>");
            p.push("</div>");
            return s.join("") + p.join("");
        },
        exec: function () {
            var me = this;
            if (selectedItem == null) return;
            $G("J_preview").innerHTML = "";
            editor.execCommand("music", {
                url: me._getUrl(false),
                width: 400,
                height: 95,
            });
        },
    };
})();
